package persistencia;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.Vector;

import clases.Premio;
import clases.casillas.Casilla;

public class AdministradorPremios
{
	
private static AdministradorPremios instancia;
	
	private AdministradorPremios()
	{
	}
	
	public static AdministradorPremios getInstancia()
	{
		if (instancia == null)
			instancia = new AdministradorPremios();
	
		return instancia;
	}

	public void insertar(Premio premio) {
		Connection con = null;
		try
		{
			con = PoolConnection.getPoolConnection().getConnection();
			PreparedStatement s = con.prepareStatement("insert into Premios (idPremio, monto) values (?, ?)");
			
			s.setString(1, premio.getId());
			s.setFloat(2, premio.getMonto());
			
			s.execute();
			
			for (int posicion=0; posicion < premio.getNombresCasillas().size(); posicion++)
				agregarCasillaAPremio(premio.getId(), premio.getNombresCasillas().get(posicion), posicion);
		}
		catch (Exception e)
		{
			System.out.println();
		}
		finally {
			if (con != null)
				PoolConnection.getPoolConnection().realeaseConnection(con);
		}
	}
	
	private void agregarCasillaAPremio(String idPremio, String nombreCasilla, int posicion) {
		Connection con = null;
		try
		{
			con = PoolConnection.getPoolConnection().getConnection();
			PreparedStatement s = con.prepareStatement("insert into CasillasPremios (idPremio, casilla, posicion) values (?, ?, ?)");
			
			s.setString(1, idPremio);
			s.setString(2, nombreCasilla);
			s.setInt(3, posicion);
			
			s.execute();
		}
		catch (Exception e)
		{
			System.out.println();
		}
		finally {
			if (con != null)
				PoolConnection.getPoolConnection().realeaseConnection(con);
		}
	}

	
	public Vector<Premio> traerTodos() {
		Vector<Premio> premios = new Vector<Premio>();
		
		try
		{
			Connection con = PoolConnection.getPoolConnection().getConnection();
			PreparedStatement s = con.prepareStatement("select idPremio, monto from Premios");
			
			ResultSet rs = s.executeQuery();
			while (rs.next()) 
			{
				String idPremio = rs.getString("idPremio");
				float monto = rs.getFloat("monto");
				
				Premio premio = new Premio(
						idPremio,
						traerCasillasDelPremio(idPremio), 
						monto);
				
				
				premios.add(premio);
			}
			
			PoolConnection.getPoolConnection().realeaseConnection(con);
		}
		catch (Exception e)
		{
			System.out.println();
		}
		Premio.setGlobalID(premios.size());
		
		return premios;
	}
	
	
	public Premio traerPremio(String idPremio)
	{
		Premio premio = null;
		try
		{
			Connection con = PoolConnection.getPoolConnection().getConnection();
			PreparedStatement s = con.prepareStatement("select monto from Premios where idPremio = ?");
			s.setString(1, idPremio);
			
			ResultSet rs = s.executeQuery();
			if (rs.next()) {
				float monto = rs.getFloat("monto");
				premio = new Premio(
						idPremio,
						traerCasillasDelPremio(idPremio), 
						monto);
				
			}
			
			PoolConnection.getPoolConnection().realeaseConnection(con);
		}
		catch (Exception e)
		{
			System.out.println();
		}
		return premio;
	}
	
	private ArrayList<Casilla> traerCasillasDelPremio(String idPremio) {
		
		ArrayList<Casilla> casillasDelPremio = new ArrayList<Casilla>();
		
		try
		{
			Connection con = PoolConnection.getPoolConnection().getConnection();
			PreparedStatement s = con.prepareStatement("select casilla from CasillasPremios where idPremio = ? order by posicion asc");
			s.setString(1, idPremio);
			
			ResultSet rs = s.executeQuery();
			while (rs.next()) 
			{
				String nombreCasilla = rs.getString("casilla");
				
				Casilla casillaDelPremio = AdministradorCasilla.getInstancia().traer(nombreCasilla);
				
				casillasDelPremio.add(casillaDelPremio);
			}
			
			PoolConnection.getPoolConnection().realeaseConnection(con);
		}
		catch (Exception e)
		{
			System.out.println();
		}
		return casillasDelPremio;
	}

	public void bajaPremio(String idPremio) {
		try
		{
			Connection con = PoolConnection.getPoolConnection().getConnection();
			PreparedStatement s = con.prepareStatement("delete CasillasPremios where idPremio = ?; delete Premios where idPremio = ?;");
			s.setString(1, idPremio);
			s.setString(2, idPremio);
			
			s.execute();
			
			PoolConnection.getPoolConnection().realeaseConnection(con);
		}
		catch (Exception e)
		{
			System.out.println();
		}
	}

}
